package com.itheima.reggie.security;

import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.mapper.EmployeeMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

/**
 *   这个类是从数据库中查出相关的用户数据
 *   也就是自定义一个UserDetailsService的实现类。去执行认证逻辑的相关权限
 *   也就是自定义一个认证逻辑，然后去对比数据库的数据 和用户传递过来的数据
 */
@Slf4j
@Service
public class EmployeeDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private EmployeeMapper employeeMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        /**
         *  1.自定义认证逻辑 首先是拿前端传递过来的用户名去数据库里查询相关的用户信息。
         *  2.构建GrantedAuthority的返回集合对象，这个集合是把每一个角色role的keyword保存到这个GrantedAuthority的集合中
         *  实现接口UserDetails时，里面有一个重写方法getAuthorities，他的返回值就是GrantedAuthority
         *  把role的keyword加入这个GrantedAuthority集合，然后把这个集合封装给UserDetails的实现类User
         *  User接受三个参数username，password ，第三个就是GrantedAuthority集合。
         *
         *  所以这里的GrantedAuthority集合的add添加keyword是在employee里面已经重写了，而且返回的employee是userDetails的实现类
         *  employee里面已经有username，password，GrantedAuthority的方法了，所以可以直接返回。
         */
        Employee byUsername = employeeMapper.findByUsername(username);
        log.info("byUsername========"+byUsername);
        return byUsername;
    }

}
